/**
 * 防抖动函数
 * @param fn 函数
 * @param delay 时间
 * @returns {(function(...[*]): void)|*}
 * handleClick: debounce(function() {
 * console.log('按钮被点击');
 * }, 1000) // 设置防抖延迟时间为1000毫秒
 */
export const debounce = (fn, delay) => {
	let timer = null;
	return function(...args) {
		if (timer) clearTimeout(timer);
		timer = setTimeout(() => {
			fn.apply(this, args);
		}, delay);
	};
};

// 节流函数
/**
 * 节流函数
 * @param func 函数
 * @param wait 时间
 * @returns {(function(...[*]): void)|*}
 */
export const throttle = (func, wait) => {
	let timeout; // 定义一个计时器变量，用于限制函数调用频率
	return function(...args) { // 返回一个包装后的函数
		const context = this; // 保存函数执行上下文对象
		if (!timeout) { // 如果计时器不存在
			func.apply(context, args); // 执行函数
			timeout = setTimeout(() => {
				timeout = null; // 清空计时器变量
			}, wait); // 创建计时器，在指定时间后重置计时器变量
		}
	};
}

/**
 * @param {Promise} h
 * @param {String} title 提示语
 * @param {String} url 跳转地址
 * @param {Number} type 1 navigateBack  2 switchTab  3 reLaunch  4 navigateTo  5 redirectTo  6 navigateBack
 * @param {Boolean} mask 遮罩
 * @param {Number} timer 提示时间
 */
export const http = ({
		h,
		title,
		url,
		type,
		mask,
		timer
	}) => {
		return new Promise((resolve, reject) => {
			uni.showLoading({
				mask: !!mask
			})
			h.then(res => {
				uni.hideLoading()
				resolve(res)
				if (title) {
					uni.showToast({duration:3000,
						title,
						icon: 'none'
					})
				}
				setTimeout(() => {
					switch (type) {
						case 1:
							uni.navigateBack()
							break;
						case 2:
							uni.switchTab({
								url
							})
							break;
						case 3:
							uni.reLaunch({
								url
							})
							break;
						case 4:
							uni.navigateTo({
								url
							})
							break;
						case 5:
							uni.redirectTo({
								url
							})
							break;
						default:
							uni.navigateBack()
					}
				}, timer ? timer : 1500)
			})
		})

	}